package com.zzh.test1;

public class SingletonSafeDoubleCheck {

    // volatile 实现禁止指令重排序
    private volatile static SingletonSafeDoubleCheck instance = null;

    private SingletonSafeDoubleCheck() {

    }

    public static SingletonSafeDoubleCheck getInstance() {
        if (instance == null) {
            synchronized (SingletonSafeDoubleCheck.class) {
                if (instance == null) {
                    // instance = new SingletonSafeDoubleCheck(); 他是有多个步骤的，中间有可能发生指令重排序
                    // 1、分配内存空间
                    // 2、初始化对象
                    // 3、设置instance指向分配的内存地址
                    // 重排序可能 导致 2、3 步骤交错执行，导致 instance 指向了未初始化的内存地址！
                    // 所以需要加上 volatile 关键字，禁止指令重排序
                    instance = new SingletonSafeDoubleCheck();
                }
            }
        }
        return instance;
    }

}
